In [1]:
# Analyse des consommations électriques régionales en France de 2013 à 2022 sur la base des données de RTE stockées dans
# le fichier eco2mix-regional-cons-def.csv
# Exploration des données brutes du fichier (recherche des valeurs manquantes, colonnes utiles/inutiles, types des données, brèves statitistiques...
# Thierry ALLEM - Projet DataScientest - Formation Data Analyst -2024
In [2]:
import numpy as np
import pandas as pd
import seaborn as sns
import datetime
import matplotlib.pyplot as plt
%matplotlib inline
In [3]:
import warnings
# Pour ignorer tous les warnings
warnings.filterwarnings('ignore')
In [4]:
# Ajustement de la largeur des colonnes des dataframes
pd.set_option('display.max_columns', None) # afficher toutes les colonnes
pd.set_option('display.width', None) # éviter le retour à la ligne auto
pd.set_option('display.colheader_justify', 'left') # alignement des en-têtes
In [5]:
df_brut = pd.read_csv('eco2mix-regional-cons-def.csv',sep=';',na_values='ND',low_memory=False)
In [6]:
df_brut['Code INSEE région'].unique()
Out[6]:
array([28, 84, 76, 93, 44, 27, 53, 11, 32, 24, 75, 52], dtype=int64)
In [7]:
df_brut.tail(20)
Out[7]:
| Code INSEE région | Région | Nature | Date | Heure | Date - Heure | Consommation (MW) | Thermique (MW) | Nucléaire (MW) | Eolien (MW) | Solaire (MW) | Hydraulique (MW) | Pompage (MW) | Bioénergies (MW) | Ech. physiques (MW) | Stockage batterie | Déstockage batterie | Eolien terrestre | Eolien offshore | TCO Thermique (%) | TCH Thermique (%) | TCO Nucléaire (%) | TCH Nucléaire (%) | TCO Eolien (%) | TCH Eolien (%) | TCO Solaire (%) | TCH Solaire (%) | TCO Hydraulique (%) | TCH Hydraulique (%) | TCO Bioénergies (%) | TCH Bioénergies (%) | Column 30 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2121388 | 44 | Grand Est | Données consolidées | 2023-01-31 | 23:00 | 2023-01-31T23:00:00+01:00 | 6434.0 | 1444.0 | 5020.0 | 1881 | 0.0 | 629.0 | -6.0 | 144.0 | -2677.0 | 0.0 | 0.0 | 0.0 | 0.0 | 22.44 | 46.06 | 78.02 | 46.40 | 29.24 | 41.33 | 0.0 | 0.0 | 9.78 | 27.32 | 2.24 | 55.38 | NaN |
| 2121389 | 93 | Provence-Alpes-Côte d'Azur | Données consolidées | 2023-01-31 | 23:00 | 2023-01-31T23:00:00+01:00 | 6176.0 | 314.0 | 0.0 | 42 | 0.0 | 1882.0 | 0.0 | 85.0 | 3854.0 | 0.0 | 0.0 | 0.0 | 0.0 | 5.08 | 11.56 | 0.00 | NaN | 0.68 | 43.75 | 0.0 | 0.0 | 30.47 | 57.66 | 1.38 | 28.62 | NaN |
| 2121390 | 24 | Centre-Val de Loire | Données consolidées | 2023-01-31 | 23:00 | 2023-01-31T23:00:00+01:00 | 2522.0 | 111.0 | 8919.0 | 349 | 0.0 | 3.0 | 0.0 | 59.0 | -6919.0 | 0.0 | 0.0 | 0.0 | 0.0 | 4.40 | 48.26 | 353.65 | 76.69 | 13.84 | 21.84 | 0.0 | 0.0 | 0.12 | 3.26 | 2.34 | 66.29 | NaN |
| 2121391 | 27 | Bourgogne-Franche-Comté | Données consolidées | 2023-01-31 | 23:00 | 2023-01-31T23:00:00+01:00 | 2768.0 | 167.0 | 0.0 | 211 | 0.0 | 222.0 | 0.0 | 49.0 | 2120.0 | 0.0 | 0.0 | 0.0 | 0.0 | 6.03 | 43.60 | 0.00 | NaN | 7.62 | 20.55 | 0.0 | 0.0 | 8.02 | 42.45 | 1.77 | 61.25 | NaN |
| 2121392 | 76 | Occitanie | Données consolidées | 2023-01-31 | 23:00 | 2023-01-31T23:00:00+01:00 | 5736.0 | 79.0 | 1234.0 | 786 | 0.0 | 1751.0 | 0.0 | 86.0 | 1800.0 | 0.0 | 0.0 | 0.0 | 0.0 | 1.38 | 27.24 | 21.51 | 47.10 | 13.70 | 47.93 | 0.0 | 0.0 | 30.53 | 33.07 | 1.50 | 50.29 | NaN |
| 2121393 | 52 | Pays de la Loire | Données consolidées | 2023-01-31 | 23:00 | 2023-01-31T23:00:00+01:00 | 3843.0 | 168.0 | 0.0 | 190 | 0.0 | 6.0 | 0.0 | 58.0 | 3421.0 | 0.0 | 0.0 | 0.0 | 0.0 | 4.37 | 8.35 | 0.00 | NaN | 4.94 | 11.01 | 0.0 | 0.0 | 0.16 | 60.00 | 1.51 | 70.73 | NaN |
| 2121394 | 28 | Normandie | Données consolidées | 2023-01-31 | 23:00 | 2023-01-31T23:00:00+01:00 | 3612.0 | 358.0 | 6277.0 | 305 | 0.0 | 16.0 | 0.0 | 88.0 | -3433.0 | 0.0 | 0.0 | 0.0 | 0.0 | 9.91 | 45.43 | 173.78 | 58.99 | 8.44 | 31.12 | 0.0 | 0.0 | 0.44 | 55.17 | 2.44 | 66.17 | NaN |
| 2121395 | 32 | Hauts-de-France | Données consolidées | 2023-01-31 | 23:00 | 2023-01-31T23:00:00+01:00 | 5162.0 | 1335.0 | 4156.0 | 1896 | 0.0 | 2.0 | 0.0 | 129.0 | -2355.0 | 0.0 | 0.0 | 0.0 | 0.0 | 25.86 | 54.83 | 80.51 | 76.12 | 36.73 | 33.24 | 0.0 | 0.0 | 0.04 | 50.00 | 2.50 | 62.02 | NaN |
| 2121396 | 11 | Île-de-France | Données consolidées | 2023-01-31 | 23:30 | 2023-01-31T23:30:00+01:00 | 9436.0 | 381.0 | 0.0 | 60 | 0.0 | 8.0 | 0.0 | 155.0 | 8835.0 | 0.0 | 0.0 | 0.0 | 0.0 | 4.04 | 17.53 | 0.00 | NaN | 0.64 | 41.38 | 0.0 | 0.0 | 0.08 | 42.11 | 1.64 | 48.59 | NaN |
| 2121397 | 28 | Normandie | Données consolidées | 2023-01-31 | 23:30 | 2023-01-31T23:30:00+01:00 | 3714.0 | 359.0 | 6279.0 | 328 | 0.0 | 16.0 | 0.0 | 88.0 | -3356.0 | 0.0 | 0.0 | 0.0 | 0.0 | 9.67 | 45.56 | 169.06 | 59.01 | 8.83 | 33.47 | 0.0 | 0.0 | 0.43 | 55.17 | 2.37 | 66.17 | NaN |
| 2121398 | 32 | Hauts-de-France | Données consolidées | 2023-01-31 | 23:30 | 2023-01-31T23:30:00+01:00 | 6137.0 | 1306.0 | 4153.0 | 2018 | 0.0 | 2.0 | 0.0 | 132.0 | -1463.0 | 0.0 | 0.0 | 0.0 | 0.0 | 21.28 | 53.63 | 67.67 | 76.06 | 32.88 | 35.38 | 0.0 | 0.0 | 0.03 | 50.00 | 2.15 | 63.46 | NaN |
| 2121399 | 24 | Centre-Val de Loire | Données consolidées | 2023-01-31 | 23:30 | 2023-01-31T23:30:00+01:00 | 2612.0 | 111.0 | 8901.0 | 350 | 0.0 | 3.0 | 0.0 | 60.0 | -6813.0 | 0.0 | 0.0 | 0.0 | 0.0 | 4.25 | 48.26 | 340.77 | 76.53 | 13.40 | 21.90 | 0.0 | 0.0 | 0.11 | 3.26 | 2.30 | 67.42 | NaN |
| 2121400 | 76 | Occitanie | Données consolidées | 2023-01-31 | 23:30 | 2023-01-31T23:30:00+01:00 | 5656.0 | 79.0 | 1233.0 | 783 | 0.0 | 1033.0 | 0.0 | 84.0 | 2443.0 | 0.0 | 0.0 | 0.0 | 0.0 | 1.40 | 27.24 | 21.80 | 47.06 | 13.84 | 47.74 | 0.0 | 0.0 | 18.26 | 19.51 | 1.49 | 49.12 | NaN |
| 2121401 | 53 | Bretagne | Données consolidées | 2023-01-31 | 23:30 | 2023-01-31T23:30:00+01:00 | 3266.0 | 683.0 | 0.0 | 136 | 0.0 | 11.0 | -1.0 | 55.0 | 2382.0 | 0.0 | 0.0 | 0.0 | 0.0 | 20.91 | 47.70 | 0.00 | NaN | 4.16 | 10.42 | 0.0 | 0.0 | 0.34 | 4.00 | 1.68 | 75.34 | NaN |
| 2121402 | 75 | Nouvelle-Aquitaine | Données consolidées | 2023-01-31 | 23:30 | 2023-01-31T23:30:00+01:00 | 5827.0 | 157.0 | 3651.0 | 44 | 0.0 | 323.0 | 0.0 | 116.0 | 1536.0 | 0.0 | 0.0 | 0.0 | 0.0 | 2.69 | 28.09 | 62.66 | 55.07 | 0.76 | 2.78 | 0.0 | 0.0 | 5.54 | 14.41 | 1.99 | 35.58 | NaN |
| 2121403 | 44 | Grand Est | Données consolidées | 2023-01-31 | 23:30 | 2023-01-31T23:30:00+01:00 | 5719.0 | 1314.0 | 5084.0 | 1975 | 0.0 | 600.0 | -6.0 | 144.0 | -3390.0 | 0.0 | 0.0 | 0.0 | 0.0 | 22.98 | 41.91 | 88.90 | 46.99 | 34.53 | 43.40 | 0.0 | 0.0 | 10.49 | 26.06 | 2.52 | 55.38 | NaN |
| 2121404 | 84 | Auvergne-Rhône-Alpes | Données consolidées | 2023-01-31 | 23:30 | 2023-01-31T23:30:00+01:00 | 8927.0 | 390.0 | 13291.0 | 148 | 0.0 | 2937.0 | -14.0 | 112.0 | -7937.0 | 0.0 | 0.0 | 0.0 | 0.0 | 4.37 | 39.84 | 148.89 | 97.94 | 1.66 | 20.47 | 0.0 | 0.0 | 32.90 | 25.76 | 1.25 | 58.64 | NaN |
| 2121405 | 27 | Bourgogne-Franche-Comté | Données consolidées | 2023-01-31 | 23:30 | 2023-01-31T23:30:00+01:00 | 2687.0 | 166.0 | 0.0 | 210 | 0.0 | 220.0 | 0.0 | 49.0 | 2044.0 | 0.0 | 0.0 | 0.0 | 0.0 | 6.18 | 43.34 | 0.00 | NaN | 7.82 | 20.45 | 0.0 | 0.0 | 8.19 | 42.07 | 1.82 | 61.25 | NaN |
| 2121406 | 93 | Provence-Alpes-Côte d'Azur | Données consolidées | 2023-01-31 | 23:30 | 2023-01-31T23:30:00+01:00 | 6139.0 | 350.0 | 0.0 | 44 | 0.0 | 1850.0 | 0.0 | 86.0 | 3811.0 | 0.0 | 0.0 | 0.0 | 0.0 | 5.70 | 12.88 | 0.00 | NaN | 0.72 | 45.83 | 0.0 | 0.0 | 30.14 | 56.68 | 1.40 | 28.96 | NaN |
| 2121407 | 52 | Pays de la Loire | Données consolidées | 2023-01-31 | 23:30 | 2023-01-31T23:30:00+01:00 | 3826.0 | 172.0 | 0.0 | 205 | 0.0 | 6.0 | 0.0 | 58.0 | 3384.0 | 0.0 | 0.0 | 0.0 | 0.0 | 4.50 | 8.54 | 0.00 | NaN | 5.36 | 11.88 | 0.0 | 0.0 | 0.16 | 60.00 | 1.52 | 70.73 | NaN |
In [8]:
# Affichage du nombre de lignes et colonnes du dataframe et décompte des types des valeurs
print("Nombre de lignes du dataframe : ", len(df_brut.index))
print("Nombre de colonnes du dataframe : ", len(df_brut.columns))
display("Types de valeurs :",df_brut.dtypes.value_counts() )
print("Nombre de doublons : ",df_brut.duplicated().sum())
Nombre de lignes du dataframe : 2121408 Nombre de colonnes du dataframe : 32
'Types de valeurs :'
float64 25 object 6 int64 1 Name: count, dtype: int64
Nombre de doublons : 0
In [9]:
df_brut.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 2121408 entries, 0 to 2121407 Data columns (total 32 columns): # Column Dtype --- ------ ----- 0 Code INSEE région int64 1 Région object 2 Nature object 3 Date object 4 Heure object 5 Date - Heure object 6 Consommation (MW) float64 7 Thermique (MW) float64 8 Nucléaire (MW) float64 9 Eolien (MW) object 10 Solaire (MW) float64 11 Hydraulique (MW) float64 12 Pompage (MW) float64 13 Bioénergies (MW) float64 14 Ech. physiques (MW) float64 15 Stockage batterie float64 16 Déstockage batterie float64 17 Eolien terrestre float64 18 Eolien offshore float64 19 TCO Thermique (%) float64 20 TCH Thermique (%) float64 21 TCO Nucléaire (%) float64 22 TCH Nucléaire (%) float64 23 TCO Eolien (%) float64 24 TCH Eolien (%) float64 25 TCO Solaire (%) float64 26 TCH Solaire (%) float64 27 TCO Hydraulique (%) float64 28 TCH Hydraulique (%) float64 29 TCO Bioénergies (%) float64 30 TCH Bioénergies (%) float64 31 Column 30 float64 dtypes: float64(25), int64(1), object(6) memory usage: 517.9+ MB
In [10]:
# Brèves statistiques de la colonne 'Consommation (MW)'
df_brut['Consommation (MW)'].describe()
Out[10]:
count 2.121396e+06 mean 4.473428e+03 std 2.162117e+03 min 7.030000e+02 25% 2.768000e+03 50% 4.102000e+03 75% 5.708000e+03 max 1.533800e+04 Name: Consommation (MW), dtype: float64
In [11]:
# Création d'un dataframe de description des colonnes de df_brut, sans regroupement par région
df_colonnes = pd.DataFrame()
# Stockage des noms des colonnes du dataframe df_brut
df_colonnes['Nom_colonne'] = list(df_brut.columns)
# Attribution du type de valeurs des colonnes
df_colonnes['Type_valeurs'] = df_brut.dtypes.values
# Ajout d'une colonne 'Valeurs_uniques' par défaut à 'Valeurs continues'
df_colonnes['Valeurs_uniques'] = 'Valeurs continues'
# Spécificité pour certaines colonnes : affichage des valeurs uniques
df_colonnes.loc[df_colonnes['Nom_colonne'] == 'Code INSEE région', 'Valeurs_uniques'] = str(df_brut['Code INSEE région'].unique())
df_colonnes.loc[df_colonnes['Nom_colonne'] == 'Région', 'Valeurs_uniques'] = str(df_brut['Région'].unique())
df_colonnes.loc[df_colonnes['Nom_colonne'] == 'Nature', 'Valeurs_uniques'] = str(df_brut['Nature'].unique())
# Option d'affichage pour éviter la troncature des chaînes
pd.set_option('display.max_colwidth', None)
# Calcul du nombre de valeurs non nulles
df_colonnes['Nb_valeurs'] = df_brut.count().values
# Calcul du nombre de NaN
df_colonnes['nb_NaN'] = df_brut.isna().sum().values
# Total des données attendues
df_colonnes['Nb_datas'] = df_colonnes['Nb_valeurs'] + df_colonnes['nb_NaN']
# Pourcentage de données présentes et manquantes
df_colonnes['%_Valeurs'] = round((df_colonnes['Nb_valeurs'] / df_colonnes['Nb_datas']) * 100, 2)
df_colonnes['%_NaN'] = round((df_colonnes['nb_NaN'] / df_colonnes['Nb_datas']) * 100, 2)
# Identification des colonnes numériques uniquement (à partir de la 7ème colonne en général)
selected_columns = df_brut.columns[6:]
numeric_columns = [col for col in selected_columns if pd.api.types.is_numeric_dtype(df_brut[col])]
# Initialisation des colonnes pour le comptage
df_colonnes['Valeurs_POSITIVES'] = 0
df_colonnes['Valeurs_NULLES'] = 0
df_colonnes['Valeurs_NEGATIVES'] = 0
# Boucle pour calculer le nombre de valeurs positives, nulles et négatives uniquement sur les colonnes numériques
for col in numeric_columns:
df_colonnes.loc[df_colonnes['Nom_colonne'] == col, 'Valeurs_POSITIVES'] = (df_brut[col] > 0).sum()
df_colonnes.loc[df_colonnes['Nom_colonne'] == col, 'Valeurs_NULLES'] = (df_brut[col] == 0).sum()
df_colonnes.loc[df_colonnes['Nom_colonne'] == col, 'Valeurs_NEGATIVES'] = (df_brut[col] < 0).sum()
# Calcul des pourcentages correspondants
df_colonnes['%_valeurs_POSITIVES'] = round((df_colonnes['Valeurs_POSITIVES'] / df_colonnes['Nb_valeurs']) * 100, 2)
df_colonnes['%_valeurs_NULLES'] = round((df_colonnes['Valeurs_NULLES'] / df_colonnes['Nb_valeurs']) * 100, 2)
df_colonnes['%_valeurs_NEGATIVES'] = round((df_colonnes['Valeurs_NEGATIVES'] / df_colonnes['Nb_valeurs']) * 100, 2)
# Vérification de la cohérence des taux (somme des pourcentages)
df_colonnes['Cumul_taux_valeurs'] = df_colonnes['%_valeurs_POSITIVES'] + df_colonnes['%_valeurs_NEGATIVES'] + df_colonnes['%_valeurs_NULLES']
# Désignation de la colonne 'Nom_colonne' comme index
df_colonnes.set_index('Nom_colonne', inplace=True)
# Export du compte-rendu dans un fichier Excel
file_export2 = 'Rapp_explo_col_eco2mix.xlsx'
df_colonnes.to_excel(file_export2)
# Message de confirmation
display("Rapport préliminaire d'exploration des colonnes du dataframe 'eco2mix-regional-cons-def' exporté avec succès dans le fichier Excel 'Rapp_explo_col_eco2mix.xlsx'")
"Rapport préliminaire d'exploration des colonnes du dataframe 'eco2mix-regional-cons-def' exporté avec succès dans le fichier Excel 'Rapp_explo_col_eco2mix.xlsx'"
In [12]:
df_colonnes.info()
<class 'pandas.core.frame.DataFrame'> Index: 32 entries, Code INSEE région to Column 30 Data columns (total 14 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Type_valeurs 32 non-null object 1 Valeurs_uniques 32 non-null object 2 Nb_valeurs 32 non-null int64 3 nb_NaN 32 non-null int64 4 Nb_datas 32 non-null int64 5 %_Valeurs 32 non-null float64 6 %_NaN 32 non-null float64 7 Valeurs_POSITIVES 32 non-null int64 8 Valeurs_NULLES 32 non-null int64 9 Valeurs_NEGATIVES 32 non-null int64 10 %_valeurs_POSITIVES 31 non-null float64 11 %_valeurs_NULLES 31 non-null float64 12 %_valeurs_NEGATIVES 31 non-null float64 13 Cumul_taux_valeurs 31 non-null float64 dtypes: float64(6), int64(6), object(2) memory usage: 3.8+ KB
In [13]:
display(df_colonnes)
| Type_valeurs | Valeurs_uniques | Nb_valeurs | nb_NaN | Nb_datas | %_Valeurs | %_NaN | Valeurs_POSITIVES | Valeurs_NULLES | Valeurs_NEGATIVES | %_valeurs_POSITIVES | %_valeurs_NULLES | %_valeurs_NEGATIVES | Cumul_taux_valeurs | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Nom_colonne | ||||||||||||||
| Code INSEE région | int64 | [28 84 76 93 44 27 53 11 32 24 75 52] | 2121408 | 0 | 2121408 | 100.00 | 0.00 | 0 | 0 | 0 | 0.00 | 0.00 | 0.00 | 0.00 |
| Région | object | ['Normandie' 'Auvergne-Rhône-Alpes' 'Occitanie'\n "Provence-Alpes-Côte d'Azur" 'Grand Est' 'Bourgogne-Franche-Comté'\n 'Bretagne' 'Île-de-France' 'Hauts-de-France' 'Centre-Val de Loire'\n 'Nouvelle-Aquitaine' 'Pays de la Loire'] | 2121408 | 0 | 2121408 | 100.00 | 0.00 | 0 | 0 | 0 | 0.00 | 0.00 | 0.00 | 0.00 |
| Nature | object | ['Données définitives' 'Données consolidées'] | 2121408 | 0 | 2121408 | 100.00 | 0.00 | 0 | 0 | 0 | 0.00 | 0.00 | 0.00 | 0.00 |
| Date | object | Valeurs continues | 2121408 | 0 | 2121408 | 100.00 | 0.00 | 0 | 0 | 0 | 0.00 | 0.00 | 0.00 | 0.00 |
| Heure | object | Valeurs continues | 2121408 | 0 | 2121408 | 100.00 | 0.00 | 0 | 0 | 0 | 0.00 | 0.00 | 0.00 | 0.00 |
| Date - Heure | object | Valeurs continues | 2121408 | 0 | 2121408 | 100.00 | 0.00 | 0 | 0 | 0 | 0.00 | 0.00 | 0.00 | 0.00 |
| Consommation (MW) | float64 | Valeurs continues | 2121396 | 12 | 2121408 | 100.00 | 0.00 | 2121396 | 0 | 0 | 100.00 | 0.00 | 0.00 | 100.00 |
| Thermique (MW) | float64 | Valeurs continues | 2121396 | 12 | 2121408 | 100.00 | 0.00 | 1877208 | 165861 | 78327 | 88.49 | 7.82 | 3.69 | 100.00 |
| Nucléaire (MW) | float64 | Valeurs continues | 1420121 | 701287 | 2121408 | 66.94 | 33.06 | 1235693 | 183984 | 444 | 87.01 | 12.96 | 0.03 | 100.00 |
| Eolien (MW) | object | Valeurs continues | 2121396 | 12 | 2121408 | 100.00 | 0.00 | 0 | 0 | 0 | 0.00 | 0.00 | 0.00 | 0.00 |
| Solaire (MW) | float64 | Valeurs continues | 2121396 | 12 | 2121408 | 100.00 | 0.00 | 1060693 | 1027266 | 33437 | 50.00 | 48.42 | 1.58 | 100.00 |
| Hydraulique (MW) | float64 | Valeurs continues | 2121396 | 12 | 2121408 | 100.00 | 0.00 | 1970569 | 150819 | 8 | 92.89 | 7.11 | 0.00 | 100.00 |
| Pompage (MW) | float64 | Valeurs continues | 1385081 | 736327 | 2121408 | 65.29 | 34.71 | 0 | 808567 | 576514 | 0.00 | 58.38 | 41.62 | 100.00 |
| Bioénergies (MW) | float64 | Valeurs continues | 2121396 | 12 | 2121408 | 100.00 | 0.00 | 2121396 | 0 | 0 | 100.00 | 0.00 | 0.00 | 100.00 |
| Ech. physiques (MW) | float64 | Valeurs continues | 2121396 | 12 | 2121408 | 100.00 | 0.00 | 1155237 | 151 | 966008 | 54.46 | 0.01 | 45.54 | 100.01 |
| Stockage batterie | float64 | Valeurs continues | 438324 | 1683084 | 2121408 | 20.66 | 79.34 | 0 | 438324 | 0 | 0.00 | 100.00 | 0.00 | 100.00 |
| Déstockage batterie | float64 | Valeurs continues | 438324 | 1683084 | 2121408 | 20.66 | 79.34 | 0 | 438324 | 0 | 0.00 | 100.00 | 0.00 | 100.00 |
| Eolien terrestre | float64 | Valeurs continues | 438324 | 1683084 | 2121408 | 20.66 | 79.34 | 0 | 438324 | 0 | 0.00 | 100.00 | 0.00 | 100.00 |
| Eolien offshore | float64 | Valeurs continues | 438324 | 1683084 | 2121408 | 20.66 | 79.34 | 0 | 438324 | 0 | 0.00 | 100.00 | 0.00 | 100.00 |
| TCO Thermique (%) | float64 | Valeurs continues | 649152 | 1472256 | 2121408 | 30.60 | 69.40 | 578636 | 70516 | 0 | 89.14 | 10.86 | 0.00 | 100.00 |
| TCH Thermique (%) | float64 | Valeurs continues | 649152 | 1472256 | 2121408 | 30.60 | 69.40 | 578636 | 70516 | 0 | 89.14 | 10.86 | 0.00 | 100.00 |
| TCO Nucléaire (%) | float64 | Valeurs continues | 561312 | 1560096 | 2121408 | 26.46 | 73.54 | 377328 | 183984 | 0 | 67.22 | 32.78 | 0.00 | 100.00 |
| TCH Nucléaire (%) | float64 | Valeurs continues | 378672 | 1742736 | 2121408 | 17.85 | 82.15 | 377328 | 1344 | 0 | 99.65 | 0.35 | 0.00 | 100.00 |
| TCO Eolien (%) | float64 | Valeurs continues | 649152 | 1472256 | 2121408 | 30.60 | 69.40 | 638818 | 10334 | 0 | 98.41 | 1.59 | 0.00 | 100.00 |
| TCH Eolien (%) | float64 | Valeurs continues | 649152 | 1472256 | 2121408 | 30.60 | 69.40 | 638818 | 10334 | 0 | 98.41 | 1.59 | 0.00 | 100.00 |
| TCO Solaire (%) | float64 | Valeurs continues | 649152 | 1472256 | 2121408 | 30.60 | 69.40 | 341306 | 307846 | 0 | 52.58 | 47.42 | 0.00 | 100.00 |
| TCH Solaire (%) | float64 | Valeurs continues | 649152 | 1472256 | 2121408 | 30.60 | 69.40 | 341306 | 307846 | 0 | 52.58 | 47.42 | 0.00 | 100.00 |
| TCO Hydraulique (%) | float64 | Valeurs continues | 649152 | 1472256 | 2121408 | 30.60 | 69.40 | 615142 | 34010 | 0 | 94.76 | 5.24 | 0.00 | 100.00 |
| TCH Hydraulique (%) | float64 | Valeurs continues | 649152 | 1472256 | 2121408 | 30.60 | 69.40 | 615142 | 34010 | 0 | 94.76 | 5.24 | 0.00 | 100.00 |
| TCO Bioénergies (%) | float64 | Valeurs continues | 649152 | 1472256 | 2121408 | 30.60 | 69.40 | 649152 | 0 | 0 | 100.00 | 0.00 | 0.00 | 100.00 |
| TCH Bioénergies (%) | float64 | Valeurs continues | 649152 | 1472256 | 2121408 | 30.60 | 69.40 | 649152 | 0 | 0 | 100.00 | 0.00 | 0.00 | 100.00 |
| Column 30 | float64 | Valeurs continues | 0 | 2121408 | 2121408 | 0.00 | 100.00 | 0 | 0 | 0 | NaN | NaN | NaN | NaN |
In [14]:
df_colonnes = df_colonnes.reset_index() # Réinitialisation de l'index
In [15]:
df_colonnes.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 32 entries, 0 to 31 Data columns (total 15 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Nom_colonne 32 non-null object 1 Type_valeurs 32 non-null object 2 Valeurs_uniques 32 non-null object 3 Nb_valeurs 32 non-null int64 4 nb_NaN 32 non-null int64 5 Nb_datas 32 non-null int64 6 %_Valeurs 32 non-null float64 7 %_NaN 32 non-null float64 8 Valeurs_POSITIVES 32 non-null int64 9 Valeurs_NULLES 32 non-null int64 10 Valeurs_NEGATIVES 32 non-null int64 11 %_valeurs_POSITIVES 31 non-null float64 12 %_valeurs_NULLES 31 non-null float64 13 %_valeurs_NEGATIVES 31 non-null float64 14 Cumul_taux_valeurs 31 non-null float64 dtypes: float64(6), int64(6), object(3) memory usage: 3.9+ KB
In [16]:
# Recherche de la date la plus ancienne des "Données définitives" et celle des "Données consolidées" par région
df_donnees=df_brut.copy()
# Groupement par région et nature
grouped = df_donnees.groupby(['Région','Nature'])['Date - Heure']
# Obtention de la dernière ligne pour 'Données définitives' et la première ligne pour 'Données consolidées'
result = pd.concat([grouped.last(), grouped.first()])
# Enregistrement des résultats dans un fichier Excel
result.to_excel('resultats.xlsx', index=True)
print("Résultats enregistrés dans 'resultats.xlsx'")
Résultats enregistrés dans 'resultats.xlsx'
In [17]:
display(result)
Région Nature
Auvergne-Rhône-Alpes Données consolidées 2023-01-31T23:30:00+01:00
Données définitives 2022-12-31T23:30:00+01:00
Bourgogne-Franche-Comté Données consolidées 2023-01-31T23:30:00+01:00
Données définitives 2022-12-31T23:30:00+01:00
Bretagne Données consolidées 2023-01-31T23:30:00+01:00
Données définitives 2022-12-31T23:30:00+01:00
Centre-Val de Loire Données consolidées 2023-01-31T23:30:00+01:00
Données définitives 2022-12-31T23:30:00+01:00
Grand Est Données consolidées 2023-01-31T23:30:00+01:00
Données définitives 2022-12-31T23:30:00+01:00
Hauts-de-France Données consolidées 2023-01-31T23:30:00+01:00
Données définitives 2022-12-31T23:30:00+01:00
Normandie Données consolidées 2023-01-31T23:30:00+01:00
Données définitives 2022-12-31T23:30:00+01:00
Nouvelle-Aquitaine Données consolidées 2023-01-31T23:30:00+01:00
Données définitives 2022-12-31T23:30:00+01:00
Occitanie Données consolidées 2023-01-31T23:30:00+01:00
Données définitives 2022-12-31T23:30:00+01:00
Pays de la Loire Données consolidées 2023-01-31T23:30:00+01:00
Données définitives 2022-12-31T23:30:00+01:00
Provence-Alpes-Côte d'Azur Données consolidées 2023-01-31T23:30:00+01:00
Données définitives 2022-12-31T23:30:00+01:00
Île-de-France Données consolidées 2023-01-31T23:30:00+01:00
Données définitives 2022-12-31T23:30:00+01:00
Auvergne-Rhône-Alpes Données consolidées 2023-01-01T00:00:00+01:00
Données définitives 2013-01-01T00:00:00+01:00
Bourgogne-Franche-Comté Données consolidées 2023-01-01T00:00:00+01:00
Données définitives 2013-01-01T00:00:00+01:00
Bretagne Données consolidées 2023-01-01T00:00:00+01:00
Données définitives 2013-01-01T00:00:00+01:00
Centre-Val de Loire Données consolidées 2023-01-01T00:00:00+01:00
Données définitives 2013-01-01T00:00:00+01:00
Grand Est Données consolidées 2023-01-01T00:00:00+01:00
Données définitives 2013-01-01T00:00:00+01:00
Hauts-de-France Données consolidées 2023-01-01T00:00:00+01:00
Données définitives 2013-01-01T00:00:00+01:00
Normandie Données consolidées 2023-01-01T00:00:00+01:00
Données définitives 2013-01-01T00:00:00+01:00
Nouvelle-Aquitaine Données consolidées 2023-01-01T00:00:00+01:00
Données définitives 2013-01-01T00:00:00+01:00
Occitanie Données consolidées 2023-01-01T00:00:00+01:00
Données définitives 2013-01-01T00:00:00+01:00
Pays de la Loire Données consolidées 2023-01-01T00:00:00+01:00
Données définitives 2013-01-01T00:00:00+01:00
Provence-Alpes-Côte d'Azur Données consolidées 2023-01-01T00:00:00+01:00
Données définitives 2013-01-01T00:00:00+01:00
Île-de-France Données consolidées 2023-01-01T00:00:00+01:00
Données définitives 2013-01-01T00:00:00+01:00
Name: Date - Heure, dtype: object
In [18]:
# Histogrammes Valeurs/Nan et distribution des valeurs de df_brut, sans regroupement par région
# Suppression de colonnes et de lignes de df_colonnes pour affichage d'histogrammes ultérieurs
# Liste des colonnes à supprimer
cols_to_drop = [1, 2, 3, 4, 5, 8, 9, 10, 11, 12, 13,14]
# Suppression des colonnes
df_hist_val_nan = df_colonnes.drop(df_colonnes.columns[cols_to_drop], axis=1)
# Réinitialisation de l'index
df_hist_val_nan = df_hist_val_nan.reset_index(drop=True)
# Liste des lignes à supprimer
rows_to_drop = [0,1, 2, 3, 4, 5,31]
# Suppression des lignes
df_hist_val_nan = df_hist_val_nan.drop(rows_to_drop, axis=0)
# Mise en forme longue du DataFrame
df_melt1 = df_hist_val_nan.melt(id_vars='Nom_colonne', var_name='Categorie', value_name='Proportion')
# Création d'une figure et d'un axe
fig, axs = plt.subplots(2,1, figsize=(50, 30))
# Création du diagramme à barres groupées
width = 0.35
histo_colonnes = sns.barplot(x='Nom_colonne', y='Proportion', hue='Categorie', data=df_melt1, ax=axs[0])
#histo_colonnes = sns.barplot(x='Nom_colonne', y='Value', hue='Category', data=df_melt1, ax=ax)
# Affichage d'une grille
plt.grid(linestyle = '-', axis = 'y')
# Récupération des positions x actuelles sur l'axe des abscisses
x_separation = histo_colonnes.get_xticks()
# Ajout d'une ligne verticale après chaque barre
for separation in x_separation:
histo_colonnes.axvline(separation + 0.5, color='red', linestyle='-')
# Affichage du titre
plt.title('Répartion des valeurs présentes et manquantes')
# Définition des limites de l'axe des y
plt.ylim(0, 100)
# Sauvegarde du graphique dans un fichier
histo_colonnes.figure.savefig('Histogramme_valeurs_nan.png')
# Histogramme des valeurs présentes- Répartitions
# Suppression de colonnes et de lignes de df_colonnes pour affichage d'histogrammes ultérieurs
# Liste des colonnes à supprimer
cols_to_drop = [1, 2, 3, 4, 5, 6, 7, 8, 10, 12,14]
# Suppression des colonnes
df_hist_val = df_colonnes.drop(df_colonnes.columns[cols_to_drop], axis=1)
# Réinitialisation de l'index
df_hist_val = df_hist_val.reset_index(drop=True)
# Liste des lignes à supprimer
rows_to_drop = [0, 2, 3, 4, 5,31]
# Suppression des lignes
df_hist_val = df_hist_val.drop(rows_to_drop, axis=0)
# Mise en forme longue du DataFrame
df_melt2 = df_hist_val.melt(id_vars='Nom_colonne', var_name='Categorie', value_name='Proportion')
# Création du diagramme à barres groupées
width = 0.35
palette_colors = palette_colors = {
'Valeurs_NULLES': 'green', # Pour les valeurs nulles
'%_valeurs_POSITIVES': '#3274a1', # Pour les valeurs positives
'%_valeurs_NEGATIVES': 'brown' # Pour les valeurs négatives
}
histo_colonnes2 = sns.barplot(x='Nom_colonne', y='Proportion', hue='Categorie', palette = palette_colors, data=df_melt2, ax=axs[1])
#histo_colonnes2 = sns.barplot(x='Nom_colonne', y='Pourcentage', hue='Distribution des valeurs', data=df_melt2, ax=axs[1])
# Affichage d'une grille
plt.grid(axis = 'y', linestyle = '--')
# Affichage du titre
plt.title('Répartion des valeurs selon leur signe algébrique')
# Définition des limites de l'axe des y
plt.ylim(0, 100)
# Récupération des positions x actuelles sur l'axe des abscisses
x_separation = histo_colonnes2.get_xticks()
# Ajout d'une ligne verticale après chaque barre
for separation in x_separation:
histo_colonnes2.axvline(separation + 0.5, color='red', linestyle='-')
# Affichage du graphique
plt.show()
# Sauvegarde du graphique dans un fichier
histo_colonnes2.figure.savefig('Repartition_valeurs_col.png')
In [19]:
# Affichage des colonnes
print(df_colonnes.iloc[:, 0].unique())
['Code INSEE région' 'Région' 'Nature' 'Date' 'Heure' 'Date - Heure' 'Consommation (MW)' 'Thermique (MW)' 'Nucléaire (MW)' 'Eolien (MW)' 'Solaire (MW)' 'Hydraulique (MW)' 'Pompage (MW)' 'Bioénergies (MW)' 'Ech. physiques (MW)' 'Stockage batterie' 'Déstockage batterie' 'Eolien terrestre' 'Eolien offshore' 'TCO Thermique (%)' 'TCH Thermique (%)' 'TCO Nucléaire (%)' 'TCH Nucléaire (%)' 'TCO Eolien (%)' 'TCH Eolien (%)' 'TCO Solaire (%)' 'TCH Solaire (%)' 'TCO Hydraulique (%)' 'TCH Hydraulique (%)' 'TCO Bioénergies (%)' 'TCH Bioénergies (%)' 'Column 30']
In [20]:
# Export du compte-rendu des colonnes dans un fichier Excel
file_export2 ='Rapp_explo_col_eco2mix.xlsx'
df_colonnes.to_excel(file_export2)
display("Rapport préliminaire d'exploration des colonnes du dataframe 'eco2mix-regional-cons-def' exporté avec succès dans le fichier Excel 'Rapp_explo_col_eco2mix.xlsx'")
"Rapport préliminaire d'exploration des colonnes du dataframe 'eco2mix-regional-cons-def' exporté avec succès dans le fichier Excel 'Rapp_explo_col_eco2mix.xlsx'"
In [21]:
display(df_colonnes)
| Nom_colonne | Type_valeurs | Valeurs_uniques | Nb_valeurs | nb_NaN | Nb_datas | %_Valeurs | %_NaN | Valeurs_POSITIVES | Valeurs_NULLES | Valeurs_NEGATIVES | %_valeurs_POSITIVES | %_valeurs_NULLES | %_valeurs_NEGATIVES | Cumul_taux_valeurs | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | Code INSEE région | int64 | [28 84 76 93 44 27 53 11 32 24 75 52] | 2121408 | 0 | 2121408 | 100.00 | 0.00 | 0 | 0 | 0 | 0.00 | 0.00 | 0.00 | 0.00 |
| 1 | Région | object | ['Normandie' 'Auvergne-Rhône-Alpes' 'Occitanie'\n "Provence-Alpes-Côte d'Azur" 'Grand Est' 'Bourgogne-Franche-Comté'\n 'Bretagne' 'Île-de-France' 'Hauts-de-France' 'Centre-Val de Loire'\n 'Nouvelle-Aquitaine' 'Pays de la Loire'] | 2121408 | 0 | 2121408 | 100.00 | 0.00 | 0 | 0 | 0 | 0.00 | 0.00 | 0.00 | 0.00 |
| 2 | Nature | object | ['Données définitives' 'Données consolidées'] | 2121408 | 0 | 2121408 | 100.00 | 0.00 | 0 | 0 | 0 | 0.00 | 0.00 | 0.00 | 0.00 |
| 3 | Date | object | Valeurs continues | 2121408 | 0 | 2121408 | 100.00 | 0.00 | 0 | 0 | 0 | 0.00 | 0.00 | 0.00 | 0.00 |
| 4 | Heure | object | Valeurs continues | 2121408 | 0 | 2121408 | 100.00 | 0.00 | 0 | 0 | 0 | 0.00 | 0.00 | 0.00 | 0.00 |
| 5 | Date - Heure | object | Valeurs continues | 2121408 | 0 | 2121408 | 100.00 | 0.00 | 0 | 0 | 0 | 0.00 | 0.00 | 0.00 | 0.00 |
| 6 | Consommation (MW) | float64 | Valeurs continues | 2121396 | 12 | 2121408 | 100.00 | 0.00 | 2121396 | 0 | 0 | 100.00 | 0.00 | 0.00 | 100.00 |
| 7 | Thermique (MW) | float64 | Valeurs continues | 2121396 | 12 | 2121408 | 100.00 | 0.00 | 1877208 | 165861 | 78327 | 88.49 | 7.82 | 3.69 | 100.00 |
| 8 | Nucléaire (MW) | float64 | Valeurs continues | 1420121 | 701287 | 2121408 | 66.94 | 33.06 | 1235693 | 183984 | 444 | 87.01 | 12.96 | 0.03 | 100.00 |
| 9 | Eolien (MW) | object | Valeurs continues | 2121396 | 12 | 2121408 | 100.00 | 0.00 | 0 | 0 | 0 | 0.00 | 0.00 | 0.00 | 0.00 |
| 10 | Solaire (MW) | float64 | Valeurs continues | 2121396 | 12 | 2121408 | 100.00 | 0.00 | 1060693 | 1027266 | 33437 | 50.00 | 48.42 | 1.58 | 100.00 |
| 11 | Hydraulique (MW) | float64 | Valeurs continues | 2121396 | 12 | 2121408 | 100.00 | 0.00 | 1970569 | 150819 | 8 | 92.89 | 7.11 | 0.00 | 100.00 |
| 12 | Pompage (MW) | float64 | Valeurs continues | 1385081 | 736327 | 2121408 | 65.29 | 34.71 | 0 | 808567 | 576514 | 0.00 | 58.38 | 41.62 | 100.00 |
| 13 | Bioénergies (MW) | float64 | Valeurs continues | 2121396 | 12 | 2121408 | 100.00 | 0.00 | 2121396 | 0 | 0 | 100.00 | 0.00 | 0.00 | 100.00 |
| 14 | Ech. physiques (MW) | float64 | Valeurs continues | 2121396 | 12 | 2121408 | 100.00 | 0.00 | 1155237 | 151 | 966008 | 54.46 | 0.01 | 45.54 | 100.01 |
| 15 | Stockage batterie | float64 | Valeurs continues | 438324 | 1683084 | 2121408 | 20.66 | 79.34 | 0 | 438324 | 0 | 0.00 | 100.00 | 0.00 | 100.00 |
| 16 | Déstockage batterie | float64 | Valeurs continues | 438324 | 1683084 | 2121408 | 20.66 | 79.34 | 0 | 438324 | 0 | 0.00 | 100.00 | 0.00 | 100.00 |
| 17 | Eolien terrestre | float64 | Valeurs continues | 438324 | 1683084 | 2121408 | 20.66 | 79.34 | 0 | 438324 | 0 | 0.00 | 100.00 | 0.00 | 100.00 |
| 18 | Eolien offshore | float64 | Valeurs continues | 438324 | 1683084 | 2121408 | 20.66 | 79.34 | 0 | 438324 | 0 | 0.00 | 100.00 | 0.00 | 100.00 |
| 19 | TCO Thermique (%) | float64 | Valeurs continues | 649152 | 1472256 | 2121408 | 30.60 | 69.40 | 578636 | 70516 | 0 | 89.14 | 10.86 | 0.00 | 100.00 |
| 20 | TCH Thermique (%) | float64 | Valeurs continues | 649152 | 1472256 | 2121408 | 30.60 | 69.40 | 578636 | 70516 | 0 | 89.14 | 10.86 | 0.00 | 100.00 |
| 21 | TCO Nucléaire (%) | float64 | Valeurs continues | 561312 | 1560096 | 2121408 | 26.46 | 73.54 | 377328 | 183984 | 0 | 67.22 | 32.78 | 0.00 | 100.00 |
| 22 | TCH Nucléaire (%) | float64 | Valeurs continues | 378672 | 1742736 | 2121408 | 17.85 | 82.15 | 377328 | 1344 | 0 | 99.65 | 0.35 | 0.00 | 100.00 |
| 23 | TCO Eolien (%) | float64 | Valeurs continues | 649152 | 1472256 | 2121408 | 30.60 | 69.40 | 638818 | 10334 | 0 | 98.41 | 1.59 | 0.00 | 100.00 |
| 24 | TCH Eolien (%) | float64 | Valeurs continues | 649152 | 1472256 | 2121408 | 30.60 | 69.40 | 638818 | 10334 | 0 | 98.41 | 1.59 | 0.00 | 100.00 |
| 25 | TCO Solaire (%) | float64 | Valeurs continues | 649152 | 1472256 | 2121408 | 30.60 | 69.40 | 341306 | 307846 | 0 | 52.58 | 47.42 | 0.00 | 100.00 |
| 26 | TCH Solaire (%) | float64 | Valeurs continues | 649152 | 1472256 | 2121408 | 30.60 | 69.40 | 341306 | 307846 | 0 | 52.58 | 47.42 | 0.00 | 100.00 |
| 27 | TCO Hydraulique (%) | float64 | Valeurs continues | 649152 | 1472256 | 2121408 | 30.60 | 69.40 | 615142 | 34010 | 0 | 94.76 | 5.24 | 0.00 | 100.00 |
| 28 | TCH Hydraulique (%) | float64 | Valeurs continues | 649152 | 1472256 | 2121408 | 30.60 | 69.40 | 615142 | 34010 | 0 | 94.76 | 5.24 | 0.00 | 100.00 |
| 29 | TCO Bioénergies (%) | float64 | Valeurs continues | 649152 | 1472256 | 2121408 | 30.60 | 69.40 | 649152 | 0 | 0 | 100.00 | 0.00 | 0.00 | 100.00 |
| 30 | TCH Bioénergies (%) | float64 | Valeurs continues | 649152 | 1472256 | 2121408 | 30.60 | 69.40 | 649152 | 0 | 0 | 100.00 | 0.00 | 0.00 | 100.00 |
| 31 | Column 30 | float64 | Valeurs continues | 0 | 2121408 | 2121408 | 0.00 | 100.00 | 0 | 0 | 0 | NaN | NaN | NaN | NaN |
In [22]:
df_colonnes.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 32 entries, 0 to 31 Data columns (total 15 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Nom_colonne 32 non-null object 1 Type_valeurs 32 non-null object 2 Valeurs_uniques 32 non-null object 3 Nb_valeurs 32 non-null int64 4 nb_NaN 32 non-null int64 5 Nb_datas 32 non-null int64 6 %_Valeurs 32 non-null float64 7 %_NaN 32 non-null float64 8 Valeurs_POSITIVES 32 non-null int64 9 Valeurs_NULLES 32 non-null int64 10 Valeurs_NEGATIVES 32 non-null int64 11 %_valeurs_POSITIVES 31 non-null float64 12 %_valeurs_NULLES 31 non-null float64 13 %_valeurs_NEGATIVES 31 non-null float64 14 Cumul_taux_valeurs 31 non-null float64 dtypes: float64(6), int64(6), object(3) memory usage: 3.9+ KB
In [23]:
# Création d'une copie du dataframe d'origine avant modifications
df=df_brut.copy()
df.head()
Out[23]:
| Code INSEE région | Région | Nature | Date | Heure | Date - Heure | Consommation (MW) | Thermique (MW) | Nucléaire (MW) | Eolien (MW) | Solaire (MW) | Hydraulique (MW) | Pompage (MW) | Bioénergies (MW) | Ech. physiques (MW) | Stockage batterie | Déstockage batterie | Eolien terrestre | Eolien offshore | TCO Thermique (%) | TCH Thermique (%) | TCO Nucléaire (%) | TCH Nucléaire (%) | TCO Eolien (%) | TCH Eolien (%) | TCO Solaire (%) | TCH Solaire (%) | TCO Hydraulique (%) | TCH Hydraulique (%) | TCO Bioénergies (%) | TCH Bioénergies (%) | Column 30 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 28 | Normandie | Données définitives | 2013-01-01 | 00:00 | 2013-01-01T00:00:00+01:00 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
| 1 | 84 | Auvergne-Rhône-Alpes | Données définitives | 2013-01-01 | 00:00 | 2013-01-01T00:00:00+01:00 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
| 2 | 76 | Occitanie | Données définitives | 2013-01-01 | 00:00 | 2013-01-01T00:00:00+01:00 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
| 3 | 93 | Provence-Alpes-Côte d'Azur | Données définitives | 2013-01-01 | 00:00 | 2013-01-01T00:00:00+01:00 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
| 4 | 44 | Grand Est | Données définitives | 2013-01-01 | 00:00 | 2013-01-01T00:00:00+01:00 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
In [24]:
df.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 2121408 entries, 0 to 2121407 Data columns (total 32 columns): # Column Dtype --- ------ ----- 0 Code INSEE région int64 1 Région object 2 Nature object 3 Date object 4 Heure object 5 Date - Heure object 6 Consommation (MW) float64 7 Thermique (MW) float64 8 Nucléaire (MW) float64 9 Eolien (MW) object 10 Solaire (MW) float64 11 Hydraulique (MW) float64 12 Pompage (MW) float64 13 Bioénergies (MW) float64 14 Ech. physiques (MW) float64 15 Stockage batterie float64 16 Déstockage batterie float64 17 Eolien terrestre float64 18 Eolien offshore float64 19 TCO Thermique (%) float64 20 TCH Thermique (%) float64 21 TCO Nucléaire (%) float64 22 TCH Nucléaire (%) float64 23 TCO Eolien (%) float64 24 TCH Eolien (%) float64 25 TCO Solaire (%) float64 26 TCH Solaire (%) float64 27 TCO Hydraulique (%) float64 28 TCH Hydraulique (%) float64 29 TCO Bioénergies (%) float64 30 TCH Bioénergies (%) float64 31 Column 30 float64 dtypes: float64(25), int64(1), object(6) memory usage: 517.9+ MB
In [25]:
# Création d'une nouvelle colonne de dates avec le format '%Y-%m-%d %H:%M'
df.insert(5, 'date_heure_cet', (df['Date'].astype(str) + ' ' + df['Heure'].astype(str)))
In [26]:
df.head()
Out[26]:
| Code INSEE région | Région | Nature | Date | Heure | date_heure_cet | Date - Heure | Consommation (MW) | Thermique (MW) | Nucléaire (MW) | Eolien (MW) | Solaire (MW) | Hydraulique (MW) | Pompage (MW) | Bioénergies (MW) | Ech. physiques (MW) | Stockage batterie | Déstockage batterie | Eolien terrestre | Eolien offshore | TCO Thermique (%) | TCH Thermique (%) | TCO Nucléaire (%) | TCH Nucléaire (%) | TCO Eolien (%) | TCH Eolien (%) | TCO Solaire (%) | TCH Solaire (%) | TCO Hydraulique (%) | TCH Hydraulique (%) | TCO Bioénergies (%) | TCH Bioénergies (%) | Column 30 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 28 | Normandie | Données définitives | 2013-01-01 | 00:00 | 2013-01-01 00:00 | 2013-01-01T00:00:00+01:00 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
| 1 | 84 | Auvergne-Rhône-Alpes | Données définitives | 2013-01-01 | 00:00 | 2013-01-01 00:00 | 2013-01-01T00:00:00+01:00 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
| 2 | 76 | Occitanie | Données définitives | 2013-01-01 | 00:00 | 2013-01-01 00:00 | 2013-01-01T00:00:00+01:00 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
| 3 | 93 | Provence-Alpes-Côte d'Azur | Données définitives | 2013-01-01 | 00:00 | 2013-01-01 00:00 | 2013-01-01T00:00:00+01:00 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
| 4 | 44 | Grand Est | Données définitives | 2013-01-01 | 00:00 | 2013-01-01 00:00 | 2013-01-01T00:00:00+01:00 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
In [27]:
# Conversion des colonnes 'date','Heure' et 'date_heure_cet' au format datetime
df['Date'] = pd.to_datetime(df['Date'], format = '%Y-%m-%d', yearfirst = True, exact = True)
df['Heure'] = pd.to_datetime(df['Heure'], format = '%H:%M')
df['date_heure_cet'] = pd.to_datetime(df['date_heure_cet'], format='%Y-%m-%d %H:%M', errors='coerce')
df.dtypes
Out[27]:
Code INSEE région int64 Région object Nature object Date datetime64[ns] Heure datetime64[ns] date_heure_cet datetime64[ns] Date - Heure object Consommation (MW) float64 Thermique (MW) float64 Nucléaire (MW) float64 Eolien (MW) object Solaire (MW) float64 Hydraulique (MW) float64 Pompage (MW) float64 Bioénergies (MW) float64 Ech. physiques (MW) float64 Stockage batterie float64 Déstockage batterie float64 Eolien terrestre float64 Eolien offshore float64 TCO Thermique (%) float64 TCH Thermique (%) float64 TCO Nucléaire (%) float64 TCH Nucléaire (%) float64 TCO Eolien (%) float64 TCH Eolien (%) float64 TCO Solaire (%) float64 TCH Solaire (%) float64 TCO Hydraulique (%) float64 TCH Hydraulique (%) float64 TCO Bioénergies (%) float64 TCH Bioénergies (%) float64 Column 30 float64 dtype: object
In [28]:
# Ajout d'une colonne 'Mois' et d'une colonne 'Année' extraites de la colonne 'Date'
df.insert(4, 'Mois', df['Date'].dt.month)
df.insert(5, 'Année', df['Date'].dt.year)
# Création d'une colonne date au format YYYY-MM, type Object
df.insert(6, 'Date YM', df['Date'].dt.strftime('%Y-%m'))
In [29]:
df.head()
Out[29]:
| Code INSEE région | Région | Nature | Date | Mois | Année | Date YM | Heure | date_heure_cet | Date - Heure | Consommation (MW) | Thermique (MW) | Nucléaire (MW) | Eolien (MW) | Solaire (MW) | Hydraulique (MW) | Pompage (MW) | Bioénergies (MW) | Ech. physiques (MW) | Stockage batterie | Déstockage batterie | Eolien terrestre | Eolien offshore | TCO Thermique (%) | TCH Thermique (%) | TCO Nucléaire (%) | TCH Nucléaire (%) | TCO Eolien (%) | TCH Eolien (%) | TCO Solaire (%) | TCH Solaire (%) | TCO Hydraulique (%) | TCH Hydraulique (%) | TCO Bioénergies (%) | TCH Bioénergies (%) | Column 30 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 28 | Normandie | Données définitives | 2013-01-01 | 1 | 2013 | 2013-01 | 1900-01-01 | 2013-01-01 | 2013-01-01T00:00:00+01:00 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
| 1 | 84 | Auvergne-Rhône-Alpes | Données définitives | 2013-01-01 | 1 | 2013 | 2013-01 | 1900-01-01 | 2013-01-01 | 2013-01-01T00:00:00+01:00 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
| 2 | 76 | Occitanie | Données définitives | 2013-01-01 | 1 | 2013 | 2013-01 | 1900-01-01 | 2013-01-01 | 2013-01-01T00:00:00+01:00 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
| 3 | 93 | Provence-Alpes-Côte d'Azur | Données définitives | 2013-01-01 | 1 | 2013 | 2013-01 | 1900-01-01 | 2013-01-01 | 2013-01-01T00:00:00+01:00 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
| 4 | 44 | Grand Est | Données définitives | 2013-01-01 | 1 | 2013 | 2013-01 | 1900-01-01 | 2013-01-01 | 2013-01-01T00:00:00+01:00 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
In [30]:
# Suppression de la colonne 'Column 30'
df.drop(columns=['Column 30'], inplace=True)
In [31]:
# Export du dataframe dans un fichier csv
eco2mix_temporaire = df.copy()
file_export_csv ='eco2mix_temporaire.csv'
eco2mix_temporaire.to_csv(file_export_csv,sep=';',encoding='latin-1')
In [32]:
# Calcul des statistiques descriptives pour la colonne 'Consommation (MW)'
stats = df['Consommation (MW)'].describe()
# Conversion des statistiques en DataFrame et transposition des résultats
stats_df = stats.to_frame().T
display(stats_df)
| count | mean | std | min | 25% | 50% | 75% | max | |
|---|---|---|---|---|---|---|---|---|
| Consommation (MW) | 2121396.0 | 4473.428121 | 2162.117017 | 703.0 | 2768.0 | 4102.0 | 5708.0 | 15338.0 |
In [33]:
# Filtrage des années entre 2013 et 2022
df_filtered = df[(df['Année'] >= 2013) & (df['Année'] <= 2021)]
# Groupement par région et application de describe()
result = df_filtered.groupby('Région')['Consommation (MW)'].describe()
# Calcul des statistiques descriptives pour l'ensemble des régions et années de 2013 à 2021
#stats = df['Consommation (MW)'].describe()
# Conversion des statistiques en DataFrame et transposition des résultats
# national_stats = stats.to_frame().T
# Créeation d'une nouvelle ligne dans le tableau incluant les statitistiques nationales de 2013 à 2021
# df_result = pd.concat([national_stats, result], axis =1)
display(result)
| count | mean | std | min | 25% | 50% | 75% | max | |
|---|---|---|---|---|---|---|---|---|
| Région | ||||||||
| Auvergne-Rhône-Alpes | 157775.0 | 7512.697753 | 1573.314869 | 4101.0 | 6253.0 | 7361.0 | 8603.0 | 13177.0 |
| Bourgogne-Franche-Comté | 157775.0 | 2434.680596 | 557.904252 | 895.0 | 1996.0 | 2399.0 | 2807.0 | 4356.0 |
| Bretagne | 157775.0 | 2543.820624 | 663.450611 | 1103.0 | 2049.0 | 2451.0 | 3016.0 | 5363.0 |
| Centre-Val de Loire | 157775.0 | 2140.340555 | 551.990006 | 1000.0 | 1719.0 | 2030.0 | 2532.0 | 4156.0 |
| Grand Est | 157775.0 | 5201.456486 | 1045.878368 | 2502.0 | 4387.0 | 5129.0 | 5906.0 | 8568.0 |
| Hauts-de-France | 157775.0 | 5769.233643 | 1108.582834 | 3292.0 | 4916.0 | 5635.0 | 6544.0 | 9598.0 |
| Normandie | 157775.0 | 3189.616295 | 726.250211 | 1675.0 | 2633.0 | 3058.0 | 3720.0 | 5759.0 |
| Nouvelle-Aquitaine | 157775.0 | 4952.291301 | 1143.357474 | 2539.0 | 4094.0 | 4760.0 | 5715.0 | 9663.0 |
| Occitanie | 157775.0 | 4270.609336 | 1033.596749 | 2167.0 | 3522.0 | 4081.0 | 4929.0 | 8699.0 |
| Pays de la Loire | 157775.0 | 3091.516609 | 801.140801 | 1401.0 | 2482.0 | 2995.0 | 3627.0 | 6265.0 |
| Provence-Alpes-Côte d'Azur | 157775.0 | 4674.547653 | 923.499098 | 2620.0 | 4000.0 | 4534.0 | 5285.0 | 8331.0 |
| Île-de-France | 157775.0 | 8069.326110 | 2144.051705 | 3869.0 | 6481.0 | 7795.0 | 9502.0 | 15338.0 |
In [34]:
# 1.2 : Gestion des noms et types de S NOMS ET TYPES DE VARIABLES
# on fait un premier dictionnaire pour changer les en-têtes du df_2 dans la même version que le df_1
dictionnaire_entetes1 = {'Code INSEE région' : 'code_insee_region',
'Région' : 'region',
'Nature' : 'nature',
'Date' : 'date',
'Heure' : 'heure',
'Date - Heure' : 'date_heure',
'Mois' : 'mois',
'Année' :'annee',
'Date YM' : 'date_ym',
'Consommation (MW)' : 'consommation',
'Thermique (MW)' : 'thermique',
'Nucléaire (MW)' : 'nucleaire',
'Eolien (MW)' : 'eolien',
'Solaire (MW)' : 'solaire',
'Hydraulique (MW)' : 'hydraulique',
'Pompage (MW)' : 'pompage',
'Bioénergies (MW)' : 'bioenergies',
'Ech. physiques (MW)' : 'ech_physiques',
'Stockage batterie' : 'stockage_batterie',
'Déstockage batterie' : 'destockage_batterie',
'TCO Thermique (%)' : 'tco_thermique',
'TCH Thermique (%)' : 'tch_thermique',
'TCO Nucléaire (%)' : 'tco_nucleaire',
'TCH Nucléaire (%)' : 'tch_nucleaire',
'TCO Eolien (%)' : 'tco_eolien',
'TCH Eolien (%)' : 'tch_eolien',
'TCO Solaire (%)' : 'tco_solaire',
'TCH Solaire (%)' : 'tch_solaire',
'TCO Hydraulique (%)' : 'tco_hydraulique',
'TCH Hydraulique (%)' : 'tch_hydraulique',
'TCO Bioénergies (%)' : 'tco_bioenergies',
'TCH Bioénergies (%)' : 'tch_bioenergies'}
df=df.rename(dictionnaire_entetes1, axis = 1)
In [35]:
df.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 2121408 entries, 0 to 2121407 Data columns (total 35 columns): # Column Dtype --- ------ ----- 0 code_insee_region int64 1 region object 2 nature object 3 date datetime64[ns] 4 mois int32 5 annee int32 6 date_ym object 7 heure datetime64[ns] 8 date_heure_cet datetime64[ns] 9 date_heure object 10 consommation float64 11 thermique float64 12 nucleaire float64 13 eolien object 14 solaire float64 15 hydraulique float64 16 pompage float64 17 bioenergies float64 18 ech_physiques float64 19 stockage_batterie float64 20 destockage_batterie float64 21 Eolien terrestre float64 22 Eolien offshore float64 23 tco_thermique float64 24 tch_thermique float64 25 tco_nucleaire float64 26 tch_nucleaire float64 27 tco_eolien float64 28 tch_eolien float64 29 tco_solaire float64 30 tch_solaire float64 31 tco_hydraulique float64 32 tch_hydraulique float64 33 tco_bioenergies float64 34 tch_bioenergies float64 dtypes: datetime64[ns](3), float64(24), int32(2), int64(1), object(5) memory usage: 550.3+ MB
In [36]:
df.head()
Out[36]:
| code_insee_region | region | nature | date | mois | annee | date_ym | heure | date_heure_cet | date_heure | consommation | thermique | nucleaire | eolien | solaire | hydraulique | pompage | bioenergies | ech_physiques | stockage_batterie | destockage_batterie | Eolien terrestre | Eolien offshore | tco_thermique | tch_thermique | tco_nucleaire | tch_nucleaire | tco_eolien | tch_eolien | tco_solaire | tch_solaire | tco_hydraulique | tch_hydraulique | tco_bioenergies | tch_bioenergies | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 28 | Normandie | Données définitives | 2013-01-01 | 1 | 2013 | 2013-01 | 1900-01-01 | 2013-01-01 | 2013-01-01T00:00:00+01:00 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
| 1 | 84 | Auvergne-Rhône-Alpes | Données définitives | 2013-01-01 | 1 | 2013 | 2013-01 | 1900-01-01 | 2013-01-01 | 2013-01-01T00:00:00+01:00 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
| 2 | 76 | Occitanie | Données définitives | 2013-01-01 | 1 | 2013 | 2013-01 | 1900-01-01 | 2013-01-01 | 2013-01-01T00:00:00+01:00 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
| 3 | 93 | Provence-Alpes-Côte d'Azur | Données définitives | 2013-01-01 | 1 | 2013 | 2013-01 | 1900-01-01 | 2013-01-01 | 2013-01-01T00:00:00+01:00 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
| 4 | 44 | Grand Est | Données définitives | 2013-01-01 | 1 | 2013 | 2013-01 | 1900-01-01 | 2013-01-01 | 2013-01-01T00:00:00+01:00 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
In [37]:
#Création de boxplot de la colonne "Consommation" à l'échelle métropolitaine et par année de 2013 à 2021 (années complètes)
from matplotlib.ticker import FuncFormatter
# Fonction pour formater les étiquettes des ordonnées avec des séparateurs de milliers
def thousands_formatter(x, pos):
return f'{int(x):,}'.replace(',', ' ')
# Filtrage des données pour les années 2013 à 2021
df_metropole = df[(df['annee'] >= 2013) & (df['annee'] <= 2021)]
# Regroupement par 'date_heure' pour obtenir la consommation totale de toutes les régions à chaque instant
df_metropole_grouped = df_metropole.groupby(['date_heure', 'annee'], as_index=False)['consommation'].sum()
# Configuration du style de seaborn
sns.set_theme(palette="bright")
# Création de la figure pour le boxplot
plt.figure(figsize=(12, 8))
# Création du boxplot
sns.boxplot(x='annee', y='consommation', data=df_metropole_grouped, color='fuchsia')
# Ajout de la grille verticale
plt.grid(axis='x', linestyle='--', color='gray')
# Graduation de l'axe des ordonnées tous les 5000 MW
plt.yticks(range(0, int(df_metropole_grouped['consommation'].max()) + 5000, 5000))
# Formater les étiquettes des ordonnées avec des séparateurs de milliers
plt.gca().yaxis.set_major_formatter(FuncFormatter(thousands_formatter))
plt.ylabel('Année')
plt.ylabel('Consommation (MW)')
# Définition du titre du graphique
plt.title('Boxplots de la consommation de la Métropole (2013-2021)')
# Sauvegarde du graphique dans un fichier image
plt.savefig('metropole_boxplot.png',dpi =300)
# Affichage du graphique
plt.show()
In [38]:
#Création de boxplot de la colonne "Consommation" à l'échelle métropolitaine et par année de 2013 à 2021 (années complètes)
# Liste des régions
sns.set_theme(palette="bright")
df_metropole = df[(df['annee'] >= 2013) & (df['annee'] <= 2021)]
plt.figure(figsize=(10, 6))
# Création du boxplot
sns.boxplot(x='annee', y='consommation', data=df_metropole, color = 'purple')
# Bornage de l'axe des abscisses
#plt.ylim(0, 16000)
# Définition du titre du graphique
plt.title('Boxplots de la consommation de la Métropole')
# Sauvegarde du graphique dans un fichier image
plt.savefig('metropole' + '_boxplot.png')
plt.show()
In [39]:
#Création de boxplot de la colonne "Consommation" par région et par année de 2013 à 2021 (années complètes)
# Liste des régions
regions = df['region'].unique()
sns.set_theme(palette="bright")
for region in regions:
# Création d'un sous-dataframe pour chaque région
df_region = df[(df['region'] == region) & (df['annee'] >= 2013) & (df['annee'] <= 2021)]
# Création d'une figure pour chaque région
plt.figure(figsize=(10, 6))
# Création du boxplot
sns.boxplot(x='annee', y='consommation', data=df_region)
# Uniformisation de l'axe des abscisses
plt.ylim(0, 16000)
# Définition du titre du graphique
plt.title('Boxplots de la consommation pour la région ' + region)
# Sauvegarde du graphique dans un fichier image
plt.savefig(region + '_boxplot.png')
plt.show()
In [40]:
df.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 2121408 entries, 0 to 2121407 Data columns (total 35 columns): # Column Dtype --- ------ ----- 0 code_insee_region int64 1 region object 2 nature object 3 date datetime64[ns] 4 mois int32 5 annee int32 6 date_ym object 7 heure datetime64[ns] 8 date_heure_cet datetime64[ns] 9 date_heure object 10 consommation float64 11 thermique float64 12 nucleaire float64 13 eolien object 14 solaire float64 15 hydraulique float64 16 pompage float64 17 bioenergies float64 18 ech_physiques float64 19 stockage_batterie float64 20 destockage_batterie float64 21 Eolien terrestre float64 22 Eolien offshore float64 23 tco_thermique float64 24 tch_thermique float64 25 tco_nucleaire float64 26 tch_nucleaire float64 27 tco_eolien float64 28 tch_eolien float64 29 tco_solaire float64 30 tch_solaire float64 31 tco_hydraulique float64 32 tch_hydraulique float64 33 tco_bioenergies float64 34 tch_bioenergies float64 dtypes: datetime64[ns](3), float64(24), int32(2), int64(1), object(5) memory usage: 550.3+ MB
In [41]:
# ****** ETUDE DES VALEURS PRESENTES ******
# Calcul du nombre de valeurs présentes pour chaque colonne, par région et par mois.
count_val = df.groupby([df['region'], df['date_ym']],as_index=False).count()
# Suppression des colonnes de count_val
count_val.drop(columns = count_val.columns[2:9], inplace=True)
# AFFICHAGE DES HEATMAPS DES VALEURS PRESENTES, REGROUPEES PAR REGION ET PAR MOIS
# 1) Création d'un dictionnaire associant les colonnes mappées avec les noms des graphiques et des fichiers images à créer
dict_heatmaps_energie = {}
colonnes=['7','8','9','10','11','12','13','14','15','16','17','18','19','20','21','22','23','24','25','26','27','28','29','30','31']
c= 0
for i in range(2, 27):
nom_colonne = count_val.columns[i]
pivot = 'pivot_'+ nom_colonne[:9]
nom_heatmap = nom_colonne[:9].replace(' ', '_') + 'val_map'
nom_fichier = colonnes[c]+'_'+ nom_colonne[:9].replace(' ', '_') + '_val_heatmap.png'
dict_heatmaps_energie[nom_colonne] = (pivot, nom_heatmap, nom_fichier)
c+=1
display(dict_heatmaps_energie)
# 2) Affichage des chronogramme des valeurs présentes pour chaque colonne de données d'énergie
for i in range(2,27):
nom_colonne = count_val.columns[i]
pivot, nom_heatmap, nom_fichier = dict_heatmaps_energie[nom_colonne]
# Pivot du DataFrame pour obtenir les dates comme colonnes
pivot_df = count_val.pivot(index='region', columns='date_ym', values=nom_colonne)
# Remplissage des valeurs manquantes avec 0
pivot_df.fillna(0, inplace=True)
# Création d'un heatmap
plt.figure(figsize=(100, 10))
nom_heatmap = sns.heatmap(pivot_df, cmap='viridis', annot=True, fmt='d', cbar_kws={'label': 'Nombre valeurs présentes'},
linewidths = 1, vmin = 0, vmax = 1488)
plt.title(f"Nombre de données présentes pour la colonne {nom_colonne}, par région et mois", fontsize = 16, pad = 20)
plt.xlabel('date_ym', fontsize = 16)
plt.ylabel('region', fontsize = 16)
plt.show()
nom_heatmap.figure.savefig(nom_fichier)
# Export Excel du compte-rendu du nb de valeurs présentes par colonne après regroupement region/jour-mois
file_export_count_val ='Rapp_count_val_eco2mix.xlsx'
count_val.to_excel(file_export_count_val)
print("Rapport préliminaire de décompte des valeurs après regroupements exporté avec succès dans le fichier Excel 'Rapp_count_val_eco2mix.xlsx'")
{'date_heure': ('pivot_date_heur',
'date_heurval_map',
'7_date_heur_val_heatmap.png'),
'consommation': ('pivot_consommat',
'consommatval_map',
'8_consommat_val_heatmap.png'),
'thermique': ('pivot_thermique',
'thermiqueval_map',
'9_thermique_val_heatmap.png'),
'nucleaire': ('pivot_nucleaire',
'nucleaireval_map',
'10_nucleaire_val_heatmap.png'),
'eolien': ('pivot_eolien', 'eolienval_map', '11_eolien_val_heatmap.png'),
'solaire': ('pivot_solaire', 'solaireval_map', '12_solaire_val_heatmap.png'),
'hydraulique': ('pivot_hydrauliq',
'hydrauliqval_map',
'13_hydrauliq_val_heatmap.png'),
'pompage': ('pivot_pompage', 'pompageval_map', '14_pompage_val_heatmap.png'),
'bioenergies': ('pivot_bioenergi',
'bioenergival_map',
'15_bioenergi_val_heatmap.png'),
'ech_physiques': ('pivot_ech_physi',
'ech_physival_map',
'16_ech_physi_val_heatmap.png'),
'stockage_batterie': ('pivot_stockage_',
'stockage_val_map',
'17_stockage__val_heatmap.png'),
'destockage_batterie': ('pivot_destockag',
'destockagval_map',
'18_destockag_val_heatmap.png'),
'Eolien terrestre': ('pivot_Eolien te',
'Eolien_teval_map',
'19_Eolien_te_val_heatmap.png'),
'Eolien offshore': ('pivot_Eolien of',
'Eolien_ofval_map',
'20_Eolien_of_val_heatmap.png'),
'tco_thermique': ('pivot_tco_therm',
'tco_thermval_map',
'21_tco_therm_val_heatmap.png'),
'tch_thermique': ('pivot_tch_therm',
'tch_thermval_map',
'22_tch_therm_val_heatmap.png'),
'tco_nucleaire': ('pivot_tco_nucle',
'tco_nucleval_map',
'23_tco_nucle_val_heatmap.png'),
'tch_nucleaire': ('pivot_tch_nucle',
'tch_nucleval_map',
'24_tch_nucle_val_heatmap.png'),
'tco_eolien': ('pivot_tco_eolie',
'tco_eolieval_map',
'25_tco_eolie_val_heatmap.png'),
'tch_eolien': ('pivot_tch_eolie',
'tch_eolieval_map',
'26_tch_eolie_val_heatmap.png'),
'tco_solaire': ('pivot_tco_solai',
'tco_solaival_map',
'27_tco_solai_val_heatmap.png'),
'tch_solaire': ('pivot_tch_solai',
'tch_solaival_map',
'28_tch_solai_val_heatmap.png'),
'tco_hydraulique': ('pivot_tco_hydra',
'tco_hydraval_map',
'29_tco_hydra_val_heatmap.png'),
'tch_hydraulique': ('pivot_tch_hydra',
'tch_hydraval_map',
'30_tch_hydra_val_heatmap.png'),
'tco_bioenergies': ('pivot_tco_bioen',
'tco_bioenval_map',
'31_tco_bioen_val_heatmap.png')}
Rapport préliminaire de décompte des valeurs après regroupements exporté avec succès dans le fichier Excel 'Rapp_count_val_eco2mix.xlsx'
In [42]:
count_val.tail(30)
Out[42]:
| region | date_ym | date_heure | consommation | thermique | nucleaire | eolien | solaire | hydraulique | pompage | bioenergies | ech_physiques | stockage_batterie | destockage_batterie | Eolien terrestre | Eolien offshore | tco_thermique | tch_thermique | tco_nucleaire | tch_nucleaire | tco_eolien | tch_eolien | tco_solaire | tch_solaire | tco_hydraulique | tch_hydraulique | tco_bioenergies | tch_bioenergies | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1422 | Île-de-France | 2020-08 | 1488 | 1488 | 1488 | 0 | 1488 | 1488 | 1488 | 0 | 1488 | 1488 | 0 | 0 | 0 | 0 | 1488 | 1488 | 0 | 0 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 |
| 1423 | Île-de-France | 2020-09 | 1440 | 1440 | 1440 | 0 | 1440 | 1440 | 1440 | 0 | 1440 | 1440 | 0 | 0 | 0 | 0 | 1440 | 1440 | 0 | 0 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 |
| 1424 | Île-de-France | 2020-10 | 1488 | 1488 | 1488 | 0 | 1488 | 1488 | 1488 | 0 | 1488 | 1488 | 0 | 0 | 0 | 0 | 1488 | 1488 | 0 | 0 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 |
| 1425 | Île-de-France | 2020-11 | 1440 | 1440 | 1440 | 0 | 1440 | 1440 | 1440 | 0 | 1440 | 1440 | 0 | 0 | 0 | 0 | 1440 | 1440 | 0 | 0 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 |
| 1426 | Île-de-France | 2020-12 | 1488 | 1488 | 1488 | 0 | 1488 | 1488 | 1488 | 0 | 1488 | 1488 | 0 | 0 | 0 | 0 | 1488 | 1488 | 0 | 0 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 |
| 1427 | Île-de-France | 2021-01 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1487 | 1487 | 1487 | 1487 | 1488 | 1488 | 1488 | 0 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 |
| 1428 | Île-de-France | 2021-02 | 1344 | 1344 | 1344 | 1344 | 1344 | 1344 | 1344 | 1344 | 1344 | 1344 | 1344 | 1344 | 1344 | 1344 | 1344 | 1344 | 1344 | 0 | 1344 | 1344 | 1344 | 1344 | 1344 | 1344 | 1344 | 1344 |
| 1429 | Île-de-France | 2021-03 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 0 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 |
| 1430 | Île-de-France | 2021-04 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 0 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 |
| 1431 | Île-de-France | 2021-05 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 0 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 |
| 1432 | Île-de-France | 2021-06 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 0 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 |
| 1433 | Île-de-France | 2021-07 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 0 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 |
| 1434 | Île-de-France | 2021-08 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 0 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 |
| 1435 | Île-de-France | 2021-09 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 0 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 |
| 1436 | Île-de-France | 2021-10 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 0 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 |
| 1437 | Île-de-France | 2021-11 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 0 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 |
| 1438 | Île-de-France | 2021-12 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 0 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 |
| 1439 | Île-de-France | 2022-01 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 0 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 |
| 1440 | Île-de-France | 2022-02 | 1344 | 1344 | 1344 | 1344 | 1344 | 1344 | 1344 | 1344 | 1344 | 1344 | 1344 | 1344 | 1344 | 1344 | 1344 | 1344 | 1344 | 0 | 1344 | 1344 | 1344 | 1344 | 1344 | 1344 | 1344 | 1344 |
| 1441 | Île-de-France | 2022-03 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 0 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 |
| 1442 | Île-de-France | 2022-04 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 0 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 |
| 1443 | Île-de-France | 2022-05 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 0 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 |
| 1444 | Île-de-France | 2022-06 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 0 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 |
| 1445 | Île-de-France | 2022-07 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 0 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 |
| 1446 | Île-de-France | 2022-08 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 0 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 |
| 1447 | Île-de-France | 2022-09 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 0 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 |
| 1448 | Île-de-France | 2022-10 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 0 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 |
| 1449 | Île-de-France | 2022-11 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 0 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 | 1440 |
| 1450 | Île-de-France | 2022-12 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 0 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 |
| 1451 | Île-de-France | 2023-01 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 0 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 | 1488 |
In [43]:
# Nettoyage des noms de colonnes
df.columns = df.columns.str.strip()
# Vérification
print(df.columns)
Index(['code_insee_region', 'region', 'nature', 'date', 'mois', 'annee',
'date_ym', 'heure', 'date_heure_cet', 'date_heure', 'consommation',
'thermique', 'nucleaire', 'eolien', 'solaire', 'hydraulique', 'pompage',
'bioenergies', 'ech_physiques', 'stockage_batterie',
'destockage_batterie', 'Eolien terrestre', 'Eolien offshore',
'tco_thermique', 'tch_thermique', 'tco_nucleaire', 'tch_nucleaire',
'tco_eolien', 'tch_eolien', 'tco_solaire', 'tch_solaire',
'tco_hydraulique', 'tch_hydraulique', 'tco_bioenergies',
'tch_bioenergies'],
dtype='object')
In [44]:
# Calcul du nombre de valeurs manquantes par région et mois
count_nan = df.groupby(['region', 'date_ym']).agg(lambda x: x.isnull().sum()).reset_index()
# Vérification des colonnes disponibles
print("Colonnes après groupby et reset_index :", count_nan.columns.tolist())
# Filtrage de certaines colonnes spécifiques
# Conserver uniquement 'region', 'date_ym' + colonnes 10 à 34
cols_a_garder = ['region', 'date_ym'] + count_nan.columns[10:35].tolist()
count_nan_filtre = count_nan[cols_a_garder]
# Export Excel du compte-rendu complet
file_export_count_nan = 'Rapp_count_nan_eco2mix.xlsx'
count_nan.to_excel(file_export_count_nan, index=False)
print(f"✅ Rapport complet exporté : {file_export_count_nan}")
# Export d'une version filtrée
# Les colonnes énergie sont : 'nucleaire', 'thermique', etc.
colonnes_energie = ['region', 'date_ym'] + [col for col in count_nan.columns if 'energie' in col.lower()]
count_nan_filtre = count_nan[colonnes_energie]
file_exp_count_nan_filtre = 'Rapp_count_nan_eco2mix_FILTRE.xlsx'
count_nan_filtre.to_excel(file_exp_count_nan_filtre, index=False)
print(f"✅ Rapport filtré exporté : {file_exp_count_nan_filtre}")
# Préparation du dictionnaire pour les heatmaps
dict_heatmaps_energie_nan = {}
for i in range(2, len(count_nan.columns)):
nom_colonne = count_nan.columns[i]
pivot = f'pivot_{nom_colonne[:7]}'
nom_heatmap = nom_colonne[:7].replace(' ', '_') + '_nan_map'
nom_fichier = nom_colonne[:7].replace(' ', '_') + '_nan_heatmap.png'
dict_heatmaps_energie_nan[nom_colonne] = (pivot, nom_heatmap, nom_fichier)
print("🗺️ Dictionnaire des heatmaps prêt :", dict_heatmaps_energie_nan)
# Affichage et export des heatmaps
for nom_colonne in list(dict_heatmaps_energie_nan.keys()):
pivot, nom_heatmap, nom_fichier = dict_heatmaps_energie_nan[nom_colonne]
# Création du pivot (région en ligne, mois en colonne)
pivot_df = count_nan.pivot(index='region', columns='date_ym', values=nom_colonne)
# Remplacement des NaN par 0
pivot_df.fillna(0, inplace=True)
# Affichage
plt.figure(figsize=(30, 8))
heatmap = sns.heatmap(pivot_df, cmap='YlOrRd', annot=True, fmt='.0f',
cbar_kws={'label': 'Nombre valeurs absentes'},
linewidths=0.5, vmin=0)
plt.title(f"Nombre de données absentes — {nom_colonne}", fontsize=16, pad=20)
plt.xlabel('Date (année-mois)', fontsize=14)
plt.ylabel('Région', fontsize=14)
# Sauvegarde
heatmap.figure.savefig(nom_fichier, bbox_inches='tight', dpi=300)
plt.show()
print(f"✅ Heatmap sauvegardée : {nom_fichier}")
Colonnes après groupby et reset_index : ['region', 'date_ym', 'code_insee_region', 'nature', 'date', 'mois', 'annee', 'heure', 'date_heure_cet', 'date_heure', 'consommation', 'thermique', 'nucleaire', 'eolien', 'solaire', 'hydraulique', 'pompage', 'bioenergies', 'ech_physiques', 'stockage_batterie', 'destockage_batterie', 'Eolien terrestre', 'Eolien offshore', 'tco_thermique', 'tch_thermique', 'tco_nucleaire', 'tch_nucleaire', 'tco_eolien', 'tch_eolien', 'tco_solaire', 'tch_solaire', 'tco_hydraulique', 'tch_hydraulique', 'tco_bioenergies', 'tch_bioenergies']
✅ Rapport complet exporté : Rapp_count_nan_eco2mix.xlsx
✅ Rapport filtré exporté : Rapp_count_nan_eco2mix_FILTRE.xlsx
🗺️ Dictionnaire des heatmaps prêt : {'code_insee_region': ('pivot_code_in', 'code_in_nan_map', 'code_in_nan_heatmap.png'), 'nature': ('pivot_nature', 'nature_nan_map', 'nature_nan_heatmap.png'), 'date': ('pivot_date', 'date_nan_map', 'date_nan_heatmap.png'), 'mois': ('pivot_mois', 'mois_nan_map', 'mois_nan_heatmap.png'), 'annee': ('pivot_annee', 'annee_nan_map', 'annee_nan_heatmap.png'), 'heure': ('pivot_heure', 'heure_nan_map', 'heure_nan_heatmap.png'), 'date_heure_cet': ('pivot_date_he', 'date_he_nan_map', 'date_he_nan_heatmap.png'), 'date_heure': ('pivot_date_he', 'date_he_nan_map', 'date_he_nan_heatmap.png'), 'consommation': ('pivot_consomm', 'consomm_nan_map', 'consomm_nan_heatmap.png'), 'thermique': ('pivot_thermiq', 'thermiq_nan_map', 'thermiq_nan_heatmap.png'), 'nucleaire': ('pivot_nucleai', 'nucleai_nan_map', 'nucleai_nan_heatmap.png'), 'eolien': ('pivot_eolien', 'eolien_nan_map', 'eolien_nan_heatmap.png'), 'solaire': ('pivot_solaire', 'solaire_nan_map', 'solaire_nan_heatmap.png'), 'hydraulique': ('pivot_hydraul', 'hydraul_nan_map', 'hydraul_nan_heatmap.png'), 'pompage': ('pivot_pompage', 'pompage_nan_map', 'pompage_nan_heatmap.png'), 'bioenergies': ('pivot_bioener', 'bioener_nan_map', 'bioener_nan_heatmap.png'), 'ech_physiques': ('pivot_ech_phy', 'ech_phy_nan_map', 'ech_phy_nan_heatmap.png'), 'stockage_batterie': ('pivot_stockag', 'stockag_nan_map', 'stockag_nan_heatmap.png'), 'destockage_batterie': ('pivot_destock', 'destock_nan_map', 'destock_nan_heatmap.png'), 'Eolien terrestre': ('pivot_Eolien ', 'Eolien__nan_map', 'Eolien__nan_heatmap.png'), 'Eolien offshore': ('pivot_Eolien ', 'Eolien__nan_map', 'Eolien__nan_heatmap.png'), 'tco_thermique': ('pivot_tco_the', 'tco_the_nan_map', 'tco_the_nan_heatmap.png'), 'tch_thermique': ('pivot_tch_the', 'tch_the_nan_map', 'tch_the_nan_heatmap.png'), 'tco_nucleaire': ('pivot_tco_nuc', 'tco_nuc_nan_map', 'tco_nuc_nan_heatmap.png'), 'tch_nucleaire': ('pivot_tch_nuc', 'tch_nuc_nan_map', 'tch_nuc_nan_heatmap.png'), 'tco_eolien': ('pivot_tco_eol', 'tco_eol_nan_map', 'tco_eol_nan_heatmap.png'), 'tch_eolien': ('pivot_tch_eol', 'tch_eol_nan_map', 'tch_eol_nan_heatmap.png'), 'tco_solaire': ('pivot_tco_sol', 'tco_sol_nan_map', 'tco_sol_nan_heatmap.png'), 'tch_solaire': ('pivot_tch_sol', 'tch_sol_nan_map', 'tch_sol_nan_heatmap.png'), 'tco_hydraulique': ('pivot_tco_hyd', 'tco_hyd_nan_map', 'tco_hyd_nan_heatmap.png'), 'tch_hydraulique': ('pivot_tch_hyd', 'tch_hyd_nan_map', 'tch_hyd_nan_heatmap.png'), 'tco_bioenergies': ('pivot_tco_bio', 'tco_bio_nan_map', 'tco_bio_nan_heatmap.png'), 'tch_bioenergies': ('pivot_tch_bio', 'tch_bio_nan_map', 'tch_bio_nan_heatmap.png')}
✅ Heatmap sauvegardée : code_in_nan_heatmap.png
✅ Heatmap sauvegardée : nature_nan_heatmap.png
✅ Heatmap sauvegardée : date_nan_heatmap.png
✅ Heatmap sauvegardée : mois_nan_heatmap.png
✅ Heatmap sauvegardée : annee_nan_heatmap.png
✅ Heatmap sauvegardée : heure_nan_heatmap.png
✅ Heatmap sauvegardée : date_he_nan_heatmap.png
✅ Heatmap sauvegardée : date_he_nan_heatmap.png
✅ Heatmap sauvegardée : consomm_nan_heatmap.png
✅ Heatmap sauvegardée : thermiq_nan_heatmap.png
✅ Heatmap sauvegardée : nucleai_nan_heatmap.png
✅ Heatmap sauvegardée : eolien_nan_heatmap.png
✅ Heatmap sauvegardée : solaire_nan_heatmap.png
✅ Heatmap sauvegardée : hydraul_nan_heatmap.png
✅ Heatmap sauvegardée : pompage_nan_heatmap.png
✅ Heatmap sauvegardée : bioener_nan_heatmap.png
✅ Heatmap sauvegardée : ech_phy_nan_heatmap.png
✅ Heatmap sauvegardée : stockag_nan_heatmap.png
✅ Heatmap sauvegardée : destock_nan_heatmap.png
✅ Heatmap sauvegardée : Eolien__nan_heatmap.png
✅ Heatmap sauvegardée : Eolien__nan_heatmap.png
✅ Heatmap sauvegardée : tco_the_nan_heatmap.png
✅ Heatmap sauvegardée : tch_the_nan_heatmap.png
✅ Heatmap sauvegardée : tco_nuc_nan_heatmap.png
✅ Heatmap sauvegardée : tch_nuc_nan_heatmap.png
✅ Heatmap sauvegardée : tco_eol_nan_heatmap.png
✅ Heatmap sauvegardée : tch_eol_nan_heatmap.png
✅ Heatmap sauvegardée : tco_sol_nan_heatmap.png
✅ Heatmap sauvegardée : tch_sol_nan_heatmap.png
✅ Heatmap sauvegardée : tco_hyd_nan_heatmap.png
✅ Heatmap sauvegardée : tch_hyd_nan_heatmap.png
✅ Heatmap sauvegardée : tco_bio_nan_heatmap.png
✅ Heatmap sauvegardée : tch_bio_nan_heatmap.png
In [45]:
# ****** ETUDE DES VALEURS EGALES A ZERO (0) ******
# Calcul du nombre de valeurs égales à 0 pour chaque colonne, par région et par mois.
count_zeros = df.groupby([df['region'], df['date_ym']]).apply(lambda x: (x==0).sum())
# Suppression des colonnes superflues de count_zeros
count_zeros = count_zeros.drop(count_zeros.columns[0:9], axis=1)
# Réinitialisation de l'index
count_zeros = count_zeros.reset_index()
# Export Excel du compte-rendu du nb de valeurs égales à 0 par colonne après regroupement Région/Jour-Mois
file_export_count_zeros ='Rapp_count_zeros_eco2mix.xlsx'
count_zeros.to_excel(file_export_count_zeros)
print("Rapport préliminaire de décompte des valeurs égales à 0 après regroupements exporté avec succès dans le fichier Excel 'Rapp_count_zeros_eco2mix.xlsx'")
# Export Excel du compte-rendu du nb de valeurs égales à 0 filtré
file_exp_count_zeros_filtre ='Rapp_count_zeros_eco2mix_FILTRE.xlsx'
count_zeros.to_excel(file_exp_count_zeros_filtre)
print("Rapport préliminaire de décompte des valeurs égales à 0 filtré exporté avec succès dans le fichier Excel 'Rapp_count_zeros_eco2mix_FILTRE.xlsx'")
# AFFICHAGE DES HEATMAPS DES VALEURS EGALES A 0, REGROUPEES PAR REGION ET PAR MOIS
# 1) Création d'un dictionnaire associant les colonnes mappées avec les noms des graphiques et des fichiers images à créer
dict_heatmaps_energie_zeros = {}
colonnes=['7','8','9','10','11','12','13','14','15','16','17','18','19','20','21','22','23','24','25','26','27','28','29','30','31']
c=0
for i in range(2, 27):
nom_colonne = count_zeros.columns[i]
pivot = 'pivot_'+ nom_colonne[:7]
nom_heatmap = nom_colonne[:9].replace(' ', '_') + 'zeros_map'
nom_fichier = colonnes[c] +'_'+ nom_colonne[:9].replace(' ', '_') + '_zeros_heatmap.png'
dict_heatmaps_energie_zeros[nom_colonne] = (pivot, nom_heatmap, nom_fichier)
c+=1
display(dict_heatmaps_energie_zeros)
# 2) Affichage des chronogramme des valeurs égales à 0 pour chaque colonne de données d'énergie
for i in range(2,27):
nom_colonne = count_zeros.columns[i]
pivot, nom_heatmap, nom_fichier = dict_heatmaps_energie_zeros[nom_colonne]
# Pivot du DataFrame pour obtenir les dates comme colonnes
pivot_df = count_zeros.pivot(index='region', columns='date_ym', values=nom_colonne)
# Création d'un heatmap
plt.figure(figsize=(100, 10))
nom_heatmap = sns.heatmap(pivot_df, cmap='YlGnBu', annot=True, fmt='d', cbar_kws={'label': 'Nombre de valeurs égales à 0'},
linewidths = 1, vmin = 0, vmax = 1488)
plt.title(f"Nombre de données égales à 0 pour la colonne {nom_colonne}, par région et mois", fontsize = 16, pad = 20)
plt.xlabel('date_ym', fontsize = 16)
plt.ylabel('region', fontsize = 16)
plt.show()
nom_heatmap.figure.savefig(nom_fichier)
Rapport préliminaire de décompte des valeurs égales à 0 après regroupements exporté avec succès dans le fichier Excel 'Rapp_count_zeros_eco2mix.xlsx' Rapport préliminaire de décompte des valeurs égales à 0 filtré exporté avec succès dans le fichier Excel 'Rapp_count_zeros_eco2mix_FILTRE.xlsx'
{'date_heure': ('pivot_date_he',
'date_heurzeros_map',
'7_date_heur_zeros_heatmap.png'),
'consommation': ('pivot_consomm',
'consommatzeros_map',
'8_consommat_zeros_heatmap.png'),
'thermique': ('pivot_thermiq',
'thermiquezeros_map',
'9_thermique_zeros_heatmap.png'),
'nucleaire': ('pivot_nucleai',
'nucleairezeros_map',
'10_nucleaire_zeros_heatmap.png'),
'eolien': ('pivot_eolien', 'eolienzeros_map', '11_eolien_zeros_heatmap.png'),
'solaire': ('pivot_solaire',
'solairezeros_map',
'12_solaire_zeros_heatmap.png'),
'hydraulique': ('pivot_hydraul',
'hydrauliqzeros_map',
'13_hydrauliq_zeros_heatmap.png'),
'pompage': ('pivot_pompage',
'pompagezeros_map',
'14_pompage_zeros_heatmap.png'),
'bioenergies': ('pivot_bioener',
'bioenergizeros_map',
'15_bioenergi_zeros_heatmap.png'),
'ech_physiques': ('pivot_ech_phy',
'ech_physizeros_map',
'16_ech_physi_zeros_heatmap.png'),
'stockage_batterie': ('pivot_stockag',
'stockage_zeros_map',
'17_stockage__zeros_heatmap.png'),
'destockage_batterie': ('pivot_destock',
'destockagzeros_map',
'18_destockag_zeros_heatmap.png'),
'Eolien terrestre': ('pivot_Eolien ',
'Eolien_tezeros_map',
'19_Eolien_te_zeros_heatmap.png'),
'Eolien offshore': ('pivot_Eolien ',
'Eolien_ofzeros_map',
'20_Eolien_of_zeros_heatmap.png'),
'tco_thermique': ('pivot_tco_the',
'tco_thermzeros_map',
'21_tco_therm_zeros_heatmap.png'),
'tch_thermique': ('pivot_tch_the',
'tch_thermzeros_map',
'22_tch_therm_zeros_heatmap.png'),
'tco_nucleaire': ('pivot_tco_nuc',
'tco_nuclezeros_map',
'23_tco_nucle_zeros_heatmap.png'),
'tch_nucleaire': ('pivot_tch_nuc',
'tch_nuclezeros_map',
'24_tch_nucle_zeros_heatmap.png'),
'tco_eolien': ('pivot_tco_eol',
'tco_eoliezeros_map',
'25_tco_eolie_zeros_heatmap.png'),
'tch_eolien': ('pivot_tch_eol',
'tch_eoliezeros_map',
'26_tch_eolie_zeros_heatmap.png'),
'tco_solaire': ('pivot_tco_sol',
'tco_solaizeros_map',
'27_tco_solai_zeros_heatmap.png'),
'tch_solaire': ('pivot_tch_sol',
'tch_solaizeros_map',
'28_tch_solai_zeros_heatmap.png'),
'tco_hydraulique': ('pivot_tco_hyd',
'tco_hydrazeros_map',
'29_tco_hydra_zeros_heatmap.png'),
'tch_hydraulique': ('pivot_tch_hyd',
'tch_hydrazeros_map',
'30_tch_hydra_zeros_heatmap.png'),
'tco_bioenergies': ('pivot_tco_bio',
'tco_bioenzeros_map',
'31_tco_bioen_zeros_heatmap.png')}
In [46]:
# Filtrage des colonnes numériques
selected_columns = [
'consommation', 'thermique', 'nucleaire', 'eolien', 'solaire',
'hydraulique', 'pompage', 'bioenergies', 'ech_physiques',
'stockage_batterie', 'destockage_batterie',
'tco_thermique', 'tch_thermique', 'tco_nucleaire', 'tch_nucleaire',
'tco_eolien', 'tch_eolien', 'tco_solaire', 'tch_solaire',
'tco_hydraulique', 'tch_hydraulique', 'tco_bioenergies', 'tch_bioenergies'
]
selected_columns_numeric = df[selected_columns].select_dtypes(include=['number']).columns
fig, axs = plt.subplots(13, 2, figsize=(15, 65))
# Aplatissement de l'array d'axes pour faciliter son utilisation
axs = axs.flatten()
plt.suptitle("Distributions des variables 'énergie' de Eco2Mix_Regional' brut")
# Création d'un histogramme pour chaque colonne numérique
for ax, col in zip(axs, selected_columns_numeric):
sns.kdeplot(df[col], ax=ax)
ax.set_title(col)
# Suppression de la zone de graphique inutilsée
fig.delaxes(axs[-1])
# Ajustement de l'espacement entre les sous-tracés
plt.tight_layout()
plt.subplots_adjust(top=0.95)
# Sauvegarde de la figure en haute résolution
plt.savefig('Histogrammes_données_brutes.png', dpi=300)
# Affichage de la figure
plt.show()
In [47]:
# Affichage d'un heatmap des corrélations du fichier Eco2Mix Regional brut
colonnes_to_drop = ['code_insee_region', 'region', 'nature','date', 'mois','annee', 'date_ym','heure','date_heure']
df_reduce = df.drop(columns=colonnes_to_drop, axis = 1)
# Remplacement des chaînes '-' par NaN
df_reduce = df_reduce.replace('-', np.nan)
# Conversion en numérique forcée
df_reduce = df_reduce.apply(pd.to_numeric, errors='coerce')
cor = df_reduce.corr()
fig, axs = plt.subplots(figsize = (50,50))
savefighcor = sns.heatmap(cor, annot = True, ax = axs, cmap = "coolwarm")
plt.show()
# Exportation des graphiques dans des fichiers
savefighcor.figure.savefig('Heatmaps_corrélations_Eco2MixReg.png')